/*
 * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.presentation.rmi;

import java.rmi.Remote;
import javax.rmi.CORBA.Tie;

import javax.rmi.CORBA.Util;

import org.omg.CORBA.CompletionStatus;

import org.omg.CORBA.portable.IDLEntity;

import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults;

import com.sun.corba.se.spi.orb.ORB;

import com.sun.corba.se.spi.logging.CORBALogDomains;

import com.sun.corba.se.impl.logging.ORBUtilSystemException;

public abstract class StubFactoryFactoryDynamicBase extends
    StubFactoryFactoryBase {

  protected final ORBUtilSystemException wrapper;

  public StubFactoryFactoryDynamicBase() {
    wrapper = ORBUtilSystemException.get(
        CORBALogDomains.RPC_PRESENTATION);
  }

  public PresentationManager.StubFactory createStubFactory(
      String className, boolean isIDLStub, String remoteCodeBase,
      Class expectedClass, ClassLoader classLoader) {
    Class cls = null;

    try {
      cls = Util.loadClass(className, remoteCodeBase, classLoader);
    } catch (ClassNotFoundException exc) {
      throw wrapper.classNotFound3(
          CompletionStatus.COMPLETED_MAYBE, exc, className);
    }

    PresentationManager pm = ORB.getPresentationManager();

    if (IDLEntity.class.isAssignableFrom(cls) &&
        !Remote.class.isAssignableFrom(cls)) {
      // IDL stubs must always use static factories.
      PresentationManager.StubFactoryFactory sff =
          pm.getStubFactoryFactory(false);
      PresentationManager.StubFactory sf =
          sff.createStubFactory(className, true, remoteCodeBase,
              expectedClass, classLoader);
      return sf;
    } else {
      PresentationManager.ClassData classData = pm.getClassData(cls);
      return makeDynamicStubFactory(pm, classData, classLoader);
    }
  }

  public abstract PresentationManager.StubFactory makeDynamicStubFactory(
      PresentationManager pm, PresentationManager.ClassData classData,
      ClassLoader classLoader);

  public Tie getTie(Class cls) {
    PresentationManager pm = ORB.getPresentationManager();
    return new ReflectiveTie(pm, wrapper);
  }

  public boolean createsDynamicStubs() {
    return true;
  }
}
